#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   File Name：    operation_excel.py
   Author :       zyq
   CreateDate：   2024/7/18 14:12
   Remark :  读取excel里的测试用例
-------------------------------------------------
"""

import openpyxl

from guitesting.common.util.logs import Log


class ReadExcel:
    def __init__(self):
        try:
            # 设置测试用例数据文件的路径
            self.file_name = PathConfig.TEST_DATA_PATH + 'test_case.xlsx'
            # 打印日志，记录打开测试用例数据文件的信息
            Log.debug(f'打开测试用例数据文件：{self.file_name}')
            # 加载测试用例数据文件
            self.workbook = openpyxl.load_workbook(filename=self.file_name)
        except Exception:
            # 打印日志，记录打开测试用例数据文件异常的信息
            Log.error(f'打开测试用例数据文件异常{Exception}')
            # 抛出异常，提示文件打开异常
            raise Exception("文件打开异常请检查！")


    def getSheetDatas(self, sheetName: str):
        """
        # 读取指定sheet页的数据放入data对象
        获取指定工作表的所有行数据，并将其转换为包含测试用例的列表list(dict)。

        Args:
            sheetName (str): 工作表的名称。

        Returns:
            list: 包含测试用例的列表，每个测试用例是一个字典，字典的键是表头，值是对应的数据。

        """
        # 获取指定工作表的所有行数据
        allDatas = list(self.workbook[sheetName].rows)

        # 提取第一行的数据作为表头
        # 测试用例表头集合
        dataTitle: list = [title.value for title in allDatas[0]]

        # 将第一行之后的数据解析后和第一行组装为测试用例
        # 遍历从第二行开始的所有行数据
        # 将每行的数据与表头对应，组成一个字典，并将这些字典存储到datas列表中
        datas = [dict(zip(dataTitle, [data.value for data in datas])) for datas in
                 allDatas[1:]]

        return datas

    # 获取cases的标题
    @staticmethod
    def getCaseTitle(testCases: list[dict], key="case_title") -> list:
        """
        通过指定的key获取用例集合中的内容，默认返回用例的标题

        :param testCases: 用例集合list[dict]
        :param key: 用例数据中对应的键
        :return: 键对应的值
        """
        # 使用列表推导式，遍历testCases列表中的每个字典
        # 从每个字典中获取指定key对应的值，组成一个新列表
        caseTitle = [caseTitle.get(key) for caseTitle in testCases]
        # 返回新列表
        return caseTitle

    def getTestCases(self, sheetNmae: str) -> dict:
        """
        获取全部的测试用例数据
        :param sheetNmae: 传入指定的excel用例集名称
        :return: 返回用例合集 caseTitle 和 caseDatas
        """

        cases = {
            "caseTitle": self.getCaseTitle(testCases=self.getSheetDatas(sheetNmae)),
            "caseDatas": self.getSheetDatas(sheetNmae)
        }
        return cases


if __name__ == '__main__':
    cases = ReadExcel().getTestCases(sheetNmae='OederControl')

    # 获取标题
    for x in cases.get('caseTitle'):
        print(x)    # None 因为目前是空的，获取的是case_title的标题

    # 获取用例数据
    for y in cases.get('caseDatas'):
        print(y)
